package com.boot.notes.aop.aspect;


import com.boot.notes.aop.annotation.NoRepeatSubmit;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 防止表单重复提交处理
 *
 * @author mkq
 * @data 2020/07/12 11:33:20
 */
@Slf4j
@Aspect
@Component
public class NoRepeatSubmitAspect {


    // 配置织入点
    @Pointcut("@annotation(com.boot.notes.aop.annotation.NoRepeatSubmit)")
    public void noRepeatSubmitPointCut() {
    }

    /**
     * 前置通知Before advice：在连接点前面执行，前置通知不会影响连接点的执行，除非此处抛出异常
     */
    @Before("noRepeatSubmitPointCut()")
    public void before(JoinPoint point) {
        handleNoRepeatSubmit(point);
        System.out.println("---------------@Before----------------");
    }

//    /**
//     * 正常返回通知After returning advice：在连接点正常执行完成后执行，如果连接点抛出异常，则不会执行
//     */
//    @AfterReturning("noRepeatSubmitPointCut()")
//    public void afterReturning() {
//
//        System.out.println("---------------@AfterReturning----------------");
//
//    }

//    /**
//     * 后置通知After (finally) advice：在连接点执行完成后执行，不管是正常执行完成，还是抛出异常，都会执行返回通知中的内容
//     */
//    @After("noRepeatSubmitPointCut()")
//    public void after() {
//        System.out.println("---------------@After----------------");
//        // 获取当前的用户
//        LoginUser loginUser = jwtTokenUtil.getLoginUser(ServletUtils.getRequest());
//        redisCache.deleteObject(loginUser.toString() + ServletUtils.getRequest().getRequestURL());
//    }

//    /**
//     * 异常返回通知After throwing advice：在连接点抛出异常后执行
//     */
//    @AfterThrowing("noRepeatSubmitPointCut()")
//    public void afterThrowing() {
//        System.out.println("---------------@AfterThrowing----------------");
//    }

//    /**
//     * 环绕通知After (finally) advice：在连接点执行完成后执行，不管是正常执行完成，还是抛出异常，都会执行返回通知中的内容
//     *
//     * @return
//     * @throws Throwable
//     */
//    @Around("noRepeatSubmitPointCut()")
//    public void around() throws Throwable {
//
//        System.out.println("---------------@Around后----------------");
//
//    }

    protected Boolean handleNoRepeatSubmit(final JoinPoint joinPoint) {
        // 获得注解
        NoRepeatSubmit controllerNoRepeatSubmit = (NoRepeatSubmit) getAnnotation(joinPoint);
        if (controllerNoRepeatSubmit == null) {

        }

        // 获取当前的用户
//        LoginUser loginUser = jwtTokenUtil.getLoginUser(ServletUtils.getRequest());
//
//        Boolean boo = redisCache.lock(loginUser.getToken().toString() + ServletUtils.getRequest().getRequestURL(), "1", controllerNoRepeatSubmit.lockTime());
//        if (!boo) {
//            //抛出异常
//            throw new CustomException("客官请稍等，切勿重复提交", HttpStatus.TWO_SUBMIT);
//        }

        return true;
    }

    /**
     * 是否存在注解，如果存在就获取
     */
    private NoRepeatSubmit getAnnotation(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();

        if (method != null) {
            return method.getAnnotation(NoRepeatSubmit.class);
        }
        return null;
    }


}
